package com.test20_多线程应用;

import java.util.ArrayList;
import java.util.List;

/**
 * 多线程加减
 * 面试题：设计4个线程对象，两个线程执行减操作，两个线程执行加操作
 */
public class YootkDemo_01 {

    public static void main(String[] args) {
        Resource resource = new Resource();
        List<Thread> threads = new ArrayList<>();
        for (int x = 0; x < 2; x++) {   // 创建加法线程
            threads.add(new Thread(() -> {
                for (int y = 0; y < 50; y++) {
                    resource.add();
                }
            }, "加法线程-" + x));
        }
        for (int x = 0; x < 2; x++) {   // 创建减法线程
            threads.add(new Thread(() -> {
                for (int y = 0; y < 50; y++) {
                    resource.sub();
                }
            }, "减法线程-" + x));
        }
        // 遍历启动线程
        // threads.forEach(thread -> thread.start());
        threads.forEach(Thread::start);
    }
}

/** 描述公共资源 */
class Resource {
    private int number = 0;     // 要操作的数字
    // flag = true：表示可以进行加法操作，但不允许进行减法操作
    // flag = false：表示可以进行减法操作，但不允许进行加法操作
    private boolean flag;   // 操作标志位

    public synchronized void add() {
        try {
            while (this.flag == false) {
                super.wait();
            }
            this.number++;
            Thread.sleep(100);
            System.out.println("【" + Thread.currentThread().getName() + "】执行加法操作，当前的操作结果为：" + this.number);
            this.flag = false;  // 加法执行完毕
            super.notifyAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public synchronized void sub() {
        try {
            while (this.flag == true) {
                super.wait();
            }
            this.number--;
            Thread.sleep(50);
            System.out.println("【" + Thread.currentThread().getName() + "】执行减法操作，当前的操作结果为：" + this.number);
            this.flag = true;   // 减法执行完毕
            super.notifyAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
